#ifndef INFINITY_DEBUG_DRAW_H
#	define INFINITY_DEBUG_DRAW_H

namespace infinity {

struct DebugDraw
{
	template< typename T >
	static void render(const dw::graphics::Colorf& color, const AABBox< T, 3 >& aabb)
	{
		glColor4f(color.r, color.g, color.b, color.a);

		glBegin(GL_LINES);

		// bottom
		glVertex3f(aabb.min.x, aabb.min.y, aabb.min.z);
		glVertex3f(aabb.max.x, aabb.min.y, aabb.min.z);

		glVertex3f(aabb.max.x, aabb.min.y, aabb.min.z);
		glVertex3f(aabb.max.x, aabb.min.y, aabb.max.z);

		glVertex3f(aabb.max.x, aabb.min.y, aabb.max.z);
		glVertex3f(aabb.min.x, aabb.min.y, aabb.max.z);

		glVertex3f(aabb.min.x, aabb.min.y, aabb.max.z);
		glVertex3f(aabb.min.x, aabb.min.y, aabb.min.z);

		// top
		glVertex3f(aabb.min.x, aabb.max.y, aabb.min.z);
		glVertex3f(aabb.max.x, aabb.max.y, aabb.min.z);

		glVertex3f(aabb.max.x, aabb.max.y, aabb.min.z);
		glVertex3f(aabb.max.x, aabb.max.y, aabb.max.z);

		glVertex3f(aabb.max.x, aabb.max.y, aabb.max.z);
		glVertex3f(aabb.min.x, aabb.max.y, aabb.max.z);

		glVertex3f(aabb.min.x, aabb.max.y, aabb.max.z);
		glVertex3f(aabb.min.x, aabb.max.y, aabb.min.z);

		// sides
		glVertex3f(aabb.min.x, aabb.min.y, aabb.min.z);
		glVertex3f(aabb.min.x, aabb.max.y, aabb.min.z);
		
		glVertex3f(aabb.max.x, aabb.min.y, aabb.min.z);
		glVertex3f(aabb.max.x, aabb.max.y, aabb.min.z);

		glVertex3f(aabb.max.x, aabb.min.y, aabb.max.z);
		glVertex3f(aabb.max.x, aabb.max.y, aabb.max.z);

		glVertex3f(aabb.min.x, aabb.min.y, aabb.max.z);
		glVertex3f(aabb.min.x, aabb.max.y, aabb.max.z);

		glEnd();
	}
};

} // namespace infinity

#endif // !INFINITY_DEBUG_DRAW_H
